#ifndef __LIST_H__
#define __LIST_H__

#include <stddef.h>
#include <stdbool.h>

typedef struct {
    void** data;
    size_t size;
    size_t capacity;
} List;

// 新建列表
List* ListNew(void);

// 在list末尾添加value
void ListAdd(List* list, void* value);

// 从数组新建列表
List* ListFromArray(void** array, size_t size);

// 删除list中指定index的元素
void ListDelete(List* list, int index);

// 删除start到end的元素
void ListDeleteRange(List* list, int start, int end);

// 清空list
void ListClear(List* list);

// 复制list到一个新列表
List* ListCopy(List* list);

// 查找list中是否具有指定value
bool ListHas(List* list, void* value, int (*compare)(const void*, const void*));

// 在list中查找指定value的索引
int ListIndex(List* list, void* value, int (*compare)(const void*, const void*));

// 删除list中的指定value
void ListRemove(List* list, void* value, int (*compare)(const void*, const void*));

// value在list中出现的次数
int ListCountValue(List* list, void* value, int (*compare)(const void*, const void*));

// 将extendList接到list后
void ListExtend(List* list, List* extendList);

// 将list重复repeat次
void ListRepeat(List* list, size_t repeat);

// 获取list中index处的元素
void* ListGet(List* list, int index);

// 把list中index处的元素设置为value
void ListSet(List* list, int index, void* value);

// 把otherList中的元素复制到list中从start到end
void ListSetFromOtherList(List* list, int start, int end, List* otherList);

// 获取list中从start到end，步数为step的元素
List* ListSlice(List* list, int start, int end, int step);

// 获取list中最小的元素
void* ListMinValue(List* list, int (*compare)(const void*, const void*));

// 获取list中最大的元素
void* ListMaxValue(List* list, int (*compare)(const void*, const void*));

// 就地将列表逆序
void ListReverse(List* list);

// 就地排序列表
void ListSort(List *list, int (*compare)(const void *, const void *));

// 释放列表
void ListFree(List* list);

#endif